package work;
//Description:实现顺序表
import java.util.Arrays;
//顺序表 效率不高
//插入和删除必须得移动元素 扩容也是问题
//所以链表修改了顺序表的缺点
public class MyArrayList {
    public int[] elem;
    public int useSize;//有效的数据个数
    MyArrayList(){//构造函数
        this.elem = new int[10];
        this.useSize = 0;
    }
    //打印顺序表
    public void display(){
        for (int i = 0; i < useSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }
    //获取顺序表的有效数据长度
    public int size(){
        return this.useSize;
    }
    //插入元素  加this！！！！！！
    public void add(int pos,int data){//pos：要添加的位置 data：要添加的元素
        if(pos < 0 || pos > useSize){//判断位置  有效元素个数一定要小于所要添加的位置不能等于
            System.out.println("pos 位置不合法");
            return;
        }
        if(isFull()){
           this.elem = Arrays.copyOf(this.elem,this.elem.length * 2);//需要接受扩容后的
        }
        if(pos < useSize){
            for (int i = this.useSize - 1; i >= pos; i--) {//添加后位置后面所有的元素向后挪一位
                this.elem[i + 1] = this.elem[i];
            }
        }
        this.elem[pos] = data;
        this.useSize ++;
    }
    //判断顺序表满不满
    public boolean isFull(){
        return this.elem.length == this.useSize;
    }
    //判断是否包含某个元素
    public boolean contains(int toFind){
        for (int i = 0; i < this.useSize; i++) {
            if(this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应的位置
    public int search(int toFind){
        for (int i = 0; i < this.useSize; i++) {
            if(this.elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
    public boolean isEmpt(){
        return this.useSize == 0;
    }
    //获取pos位置的元素
    public int getPos(int pos){
        if(pos < 0 ||pos >= this.useSize){
            System.out.println("pos 位置不合法");
            return -1;//业务处理以后可以抛异常
        }
        if(isEmpt()){
            System.out.println("顺序表为空");
            return -1;
        }
        return this.elem[pos];
    }
    //给pos位置的元素设为value
    public void setPos(int pos,int value){
        if(pos < 0 ||pos >= this.useSize){
            System.out.println("pos 位置不合法");
            return ;
        }
        if(isEmpt()){
            System.out.println("顺序表为空");
            return;
        }
        this.elem[pos] = value;
    }
    //删除第一次出现的关键字key
    public void remove(int toRemove){
        if(isEmpt()){
            System.out.println("顺序表为空");
            return;
        }
        int a = search(toRemove);//接受找到的元素下标
        if(a == -1) {
            System.out.println("没有");
            return;
        }
        /*for (int i = 0; i < this.useSize; i++) {
            if(this.elem[i] == toRemove){
                a = i;
                break;
            }
        }*/
        for (int i = a; i < this.useSize - 1; i++) {//把删除的元素后面所有元素向前移动一位i不能到达size位置 否则会越界
            this.elem[i] = this.elem[i + 1];
        }
        this.useSize--;
        //this.elem[useSize] = null;//如果是引用类型 需要这样做 目前这里先不需要 因为后续增加元素会挤掉这个废弃的元素
    }
    //清空顺序表
    public void clear(){

        this.useSize = 0;
    }
}
